bitkeeper revision 1.1691.1.6 (42a6b81aGnsCnSz81D0LDCSasR3Jyw)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 8 Jun 2005 09:19:22 +0000 (09:19 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 8 Jun 2005 09:19:22 +0000 (09:19 +0000)
Export xen_section info from generic Elf parser. Use this to detect
PAE mismatch between Xen and dom0 image.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/ia64/domain.c
xen/arch/x86/domain_build.c
xen/common/elf.c
xen/include/xen/sched.h

index 144a4f149b6b97e008af085da0cf1a5591152fe5..bcaabbb0239d719c17227ffc5430f64153e15a9f 100644 (file)
@@ -823,14 +823,14 @@ int construct_dom0(struct domain *d,
 
     /* Temp workaround */
     if (running_on_sim)
-       dsi.xen_elf_image = 1;
+       dsi.xen_section_string = (char *)1;
 
-    if ((!vmx_enabled) && !dsi.xen_elf_image) {
+    if ((!vmx_enabled) && !dsi.xen_section_string) {
        printk("Lack of hardware support for unmodified vmx dom0\n");
        panic("");
     }
 
-    if (vmx_enabled && !dsi.xen_elf_image) {
+    if (vmx_enabled && !dsi.xen_section_string) {
        printk("Dom0 is vmx domain!\n");
        vmx_dom0 = 1;
     }
index a74fa1766ebc5c1ebb0f94d8fb708df1eb759f23..f268baede2ef99a3145771bcacc75feac63e1cd1 100644 (file)
@@ -74,7 +74,7 @@ int construct_dom0(struct domain *d,
                    unsigned long _initrd_start, unsigned long initrd_len,
                    char *cmdline)
 {
-    int i, rc;
+    int i, rc, dom0_pae, xen_pae;
     unsigned long pfn, mfn;
     unsigned long nr_pages;
     unsigned long nr_pt_pages;
@@ -122,7 +122,8 @@ int construct_dom0(struct domain *d,
     unsigned long mpt_alloc;
 
     extern void physdev_init_dom0(struct domain *);
-    extern void translate_l2pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn);
+    extern void translate_l2pgtable(
+        struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn);
 
     /* Sanity! */
     if ( d->domain_id != 0 ) 
@@ -150,6 +151,21 @@ int construct_dom0(struct domain *d,
     if ( (rc = parseelfimage(&dsi)) != 0 )
         return rc;
 
+    if ( dsi.xen_section_string == NULL )
+    {
+        printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
+        return -EINVAL;
+    }
+
+    dom0_pae = !!strstr(dsi.xen_section_string, "PAE=yes");
+    xen_pae  = (CONFIG_PAGING_LEVELS == 3);
+    if ( dom0_pae != xen_pae )
+    {
+        printk("PAE mode mismatch between Xen and DOM0 (xen=%s, dom0=%s)\n",
+               xen_pae ? "yes" : "no", dom0_pae ? "yes" : "no");
+        return -EINVAL;
+    }
+
     /* Align load address to 4MB boundary. */
     dsi.v_start &= ~((1UL<<22)-1);
 
index 42c88b0d96ec067eb65e4561907f9540133ff325..08ff377d7c84402b0bef2b47c984b9fc67d5ab9b 100644 (file)
 #include <xen/elf.h>
 #include <xen/sched.h>
 
-#ifdef CONFIG_X86
-#define FORCE_XENELF_IMAGE 1
-#elif defined(__ia64__)
-#define FORCE_XENELF_IMAGE 0
-#endif
-
 static void loadelfsymtab(struct domain_setup_info *dsi, int doload);
 static inline int is_loadable_phdr(Elf_Phdr *phdr)
 {
@@ -85,16 +79,8 @@ int parseelfimage(struct domain_setup_info *dsi)
 
         break;
     }
-    if ( guestinfo == NULL )
-    {
-        printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
-       dsi->xen_elf_image = 0;
-#if FORCE_XENELF_IMAGE
-        return -EINVAL;
-#endif
-    } else {
-       dsi->xen_elf_image = 1;
-    }
+
+    dsi->xen_section_string = guestinfo;
 
     for ( h = 0; h < ehdr->e_phnum; h++ ) 
     {
index f68abd59e3d756241479827f6429ab5544b24bab..35a3c36cab6a37c990e0e32d4c9a4e81dff04559 100644 (file)
@@ -155,7 +155,7 @@ struct domain_setup_info
     unsigned long symtab_addr;
     unsigned long symtab_len;
     /* Indicate whether it's xen specific image */
-    unsigned int xen_elf_image;
+    char *xen_section_string;
 };
 
 extern struct domain idle0_domain;